import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user' // 登录组件要引入用户信息的login内容
import { resetRouter } from '@/router'

const state = { // 初始化state
  token: getToken(), // 设置token初始状态   token持久化 => 放到缓存中
  userInfo: {} // 定义一个空的对象，不是null 因为后面要开发userInfo的属性要给别人用 userInfo.name
}
const mutations = {
  setToken(state, token) {
    state.token = token // 设置token  只是修改state的数据  123 =》 1234
    setToken(token)
  },
  removeToken(state) {
    state.token = null // 删除vuex的token
    removeToken()
  },

  setUserInfo(state, result) {
    state.userInfo = result
  },
  removeUserInfo(state) {
    state.userInfo = {}
  }

}// 将所有的结果赋给了"userInfo"这个对象中，如果想要取其中一个值，我们还可以在getters中建立相应的映射

const actions = {
  async login(context, data) {
    const result = await login(data) // this是作用在组件里的
    // axios默认增加一层data
    // if (result.data.success) {
    context.commit('setToken', result) // 经过请求之后，result就被赋值为data了，这里就直接作为result
    // }
  },
  async getUserInfo(context) { // 封装获取用户资料action
    const result = await getUserInfo() // 获取返回值,result就是用户的基本资料
    const baseInfo = await
    getUserDetailById(result.userId) // 为了获取头像
    const baseResult = { ...result, ...baseInfo } // 合并两个接口
    // 此时已经获取到了用户基本资料，为了头像再调用一个接口
    context.commit('setUserInfo', baseResult) // 将整个个人信息设置到用户的vuex数据中
    return result
  },
  logout(context) {
    context.commit('removeToken') // 不仅仅删除了vuex中的，还删除了缓存中的
    // 删除用户资料
    context.commit('removeUserInfo') // 删除用户信息
    resetRouter()
    // 还有一步  vuex中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中 user子模块  permission子模块
    // 子模块调用子模块的action  默认情况下 子模块的context是子模块的
    // 父模块 调用 子模块的action
    context.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions }
